[RDS] Oracle Database の監査ログを定期的にS3に保存する

[RDS] Oracle Database の監査ログを定期的にS3に保存する

Clock Icon2018.02.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

今回はタイトルの通りです。RDS Oracle では、パラーメータグループでaudit_trailOSまたはXMLと指定することで、標準監査の監査ファイルが保存されます。オンプレミスやEC2にOracle Databaseをインストールして実行する場合には、適時、このファイルを保存・参照可能ですが、RDSではOS上のファイルに直接することができません。RDSの場合、マネジメントコンソール、またはAPIを利用してダウンロードすることが可能です。

この監査ファイルですが、公式ドキュメントによると7日間は保存されますが、それ以上は削除される可能性があります。

そのため、運用要件上、長期間の保存が必要な場合には、ダウンロードして外部に保存しておく必要があります。

やってみた

という訳で実際にやってみます。

Lambda関数を毎時実行し、RDSのAPIからログを取得、S3に保存します。

Lambda関数の作成

Python 2.7で以下のコードを作成しました。

import boto3
import datetime
import time
import json
import os

BUCKET_NAME = os.environ["BUCKET_NAME"]

rds = boto3.client('rds')
s3 = boto3.resource('s3')

def lambda_handler(event,context):

    DB_NAME = event['DB_INSTANCE_NAME']
    LOG_TYPE = event['DB_LOG_TYPE']

    BUCKET_PLEFIX = DB_NAME + "/" + datetime.datetime.now().strftime('%Y-%m-%d') + "/" + datetime.datetime.now().strftime('%H') + "/"
    SINCE = datetime.datetime.now().replace(minute=0,second=0,microsecond=0) - datetime.timedelta(hours=1)
    SINCE_U = int(time.mktime(SINCE.timetuple())) * 1000

    #指定時間以降のログファイル一覧を取得
    loglist = rds.describe_db_log_files(
        DBInstanceIdentifier = DB_NAME,
        FilenameContains = LOG_TYPE,
        FileLastWritten = SINCE_U
    )

    #対象のログファイルを取得しS3に保存
    for logs in loglist["DescribeDBLogFiles"]:
        LOGFILE_NAME = logs["LogFileName"]
        log = rds.download_db_log_file_portion(
            DBInstanceIdentifier = DB_NAME,
            LogFileName = LOGFILE_NAME
        )
        OBJECT_KEY = BUCKET_PLEFIX + LOGFILE_NAME
        obj = s3.Object(BUCKET_NAME,OBJECT_KEY)
        r = obj.put(Body = json.dumps(log))

実行された時刻の分秒を切り捨てた1時間前以降に出力されたログを保存します。例えば、17:15に実行された場合には、最終書き込みが16:00以降のログを保存します。

環境変数で、保存先のS3バケットを指定します。

また、実行する関数のIAMロールには、RDSの読み取りとS3バケットへの書き込み権限を付与しておきます。

CloudWatch Eventsの作成

CloudWatch Eventsで毎時実行させるイベントを作成します。

毎時01分に実行させるよう、Cron式で1 * * * ? *を指定します。イベントの入力には、対象のRDSインスタンスの識別子(名前)と対象のログ種別(今回はaudit)を指定します。

{
  "DB_INSTANCE_NAME" : "test",
  "DB_LOG_TYPE" : "audit"
}

実行結果

実行結果です。指定したS3にコピーされた監査ファイルが保存されています。(バケット)/ (RDSインスタンス名)/YYYY-MM-DD/HH/audit/にログが保存されます。

まとめ

以上です。auditの部分をtraceなどに変更することで、他のログにも適用は可能かもしれません。

ただし、実際の環境に適用する場合、ワークロードによっては大量の監査ファイルが出力されるため、1時間に1回の実行では実行時間が長くなり、Lamdbaでの実行が適さないこともあります。運用環境に適用するにあたっては、ログファイルの量のモニタリングや、実行頻度の調整を検討ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.